from odoo import fields, models


class Member(models.Model):
    """
    代理继承

    代理继承无需复制数据即可在数据库中复用数据结构，这通过将一个模型嵌入另一个来实现。
    UML 中这种称作组合(composition)关系：父类无需子类即可存在，而子类必须要有父类才能存在

    在实际开发中，原型继承（_name + _inherit）一般通过抽象 mixin 类，很少这样直接继承普通模型，因为这样会创建冗余的数据结构
    """
    _name = 'library.member'
    _description = 'Library Member'
    _inherit = ['mail.thread', 'mail.activity.mixin']

    card_number = fields.Char()
    # 引入delegate=True字段属性使用代理继承，library.member 中嵌入了继承模型res.partner
    # 因此在创建会员记录时，一个关联的 Partner 会自动被创建并通过partner_id字段引用
    # 在后台中，Partner 字段存储在关联的 Partner 记录，没有重复的数据结构
    # Partner 模型中的方法在 Member 模型中不可使用
    partner_id = fields.Many2one(
        'res.partner',
        delegate=True,
        ondelete='cascade',
        required=True)
